package IA;
import Grafico.*;
import Mundo.*;
import Personajes.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.Serializable;
import java.util.ArrayList;
public class Objetivo implements Serializable{

    private boolean muerte; // activa el objetivo de dar muerte a ciertos batallones
    private boolean llegar;// activa el objetivo de llegar hasta cierto limite
    private boolean reclutar;// activa el objetivo de reclutar a ciertos batallones neutros
    private Batallon[] batallones_muertos = null;// en caso muerte este activa estos seran los batallones a quienes se deberan matar
    private int y;// en caso llegar este activa, este sera el y al q se debera llegar
    private int x;// en caso llegar este activa, este sera el x al q se debera llegar pero con +- un rango
    private int rang_x;//en caso llegar este activa, este sera el rango de x para llegar
    private Batallon[] reclutados = null;// en caso reclutar este activa, esta sera un arreglo de todos los batallones a los cuales reclutar
    private boolean cumplido; // dice si esta o no cumplido
    private int y_impasable;// sera el y del lugar del mapa del cual no se puede pasar
    private int x_impasable;// sera el x del lugar del mapa cual no se podra pasar pero +- un rango
    private int rang_x_impasable;// sera el rango de x que no se podra pasar
    private Mapa mapa;// mapa donde debera ser cumplido el objetivo
    private Ejercito ejercito;// solo usado en llegar, siempre seria el ejercito patriota
    private String mensaje;
    private static ArrayList<BufferedImage> tiles;

// Atentos aqui porque el constructor es la parte mas importante de objetivos, pues es aqui donde se seteara que objetivos se seguiran.

    public Objetivo(ArrayList<BufferedImage> ti){

        tiles=ti;
    }
    
    public Objetivo(boolean muerte, boolean llegar, boolean reclutar, Batallon[] batallones_muertos, int y, int x, int rang_x, Batallon[] reclutados, int y_impasable, int x_impasable, int rang_x_impasable, Mapa mapa, Ejercito ejercito,String mensaje) {

        this.muerte = muerte;
        this.mensaje=mensaje;

//        if (this.muerte) {

            this.batallones_muertos = batallones_muertos;

 //       }
        this.llegar = llegar;
        if (this.llegar) {

            this.y = y;
            this.x = x;
            this.rang_x = rang_x;
            this.ejercito = ejercito;
        }

        this.reclutar = reclutar;
        if (this.reclutar) {
            this.reclutados = reclutados;
        }
        
        this.y_impasable = y_impasable;
        this.x_impasable = x_impasable;
        this.rang_x_impasable = rang_x_impasable;

        this.mapa = mapa;

        for (int i = x_impasable - rang_x_impasable; i <= x_impasable + rang_x_impasable; i++) {

            if(mapa.celdas[y_impasable][i].getTipoTerreno()!='M' && mapa.celdas[y_impasable][i].getTipoTerreno()!='m' && mapa.celdas[y_impasable][i].getTipoTerreno()!='e' && mapa.celdas[y_impasable][i].getTipoTerreno()!='.' && mapa.celdas[y_impasable][i].getTipoTerreno()!='E'){
                mapa.celdas[y_impasable][i].setElementoEnCelda('.');
                mapa.celdas[y_impasable][i].setTile(tiles.get(1));
            }
            if(mapa.celdas[y_impasable][i].getTipoTerreno()==','){
                mapa.celdas[y_impasable][i].setElementoEnCelda('.');
                mapa.celdas[y_impasable][i].setTile(tiles.get(5));

            }

        }

    }

    public void imprime_objetivo(Ventana_principal v){

        if (!cumplido ){
//            System.out.print("\n" + mensaje + "\n");            
            v.setCadObj(mensaje);
//            v.setImprimirObj(true);
        }
    }

    public Batallon[] get_bat_muer(){

        return this.batallones_muertos;

    }

    private boolean verifica_muerte() {

        boolean obj = true;

        for (int i = 0; i < this.batallones_muertos.length; i++) {
            if (this.batallones_muertos[i] != null) 
                obj = obj && this.batallones_muertos[i].isMuerto();
        }

        return obj;
    }

    private boolean verifica_recluta() { // siempre que dejen de ser neutros

        boolean obj = true;

        for (int i = 0; i < this.reclutados.length; i++) {
            if (this.reclutados[i] != null) 
                obj = obj && (this.reclutados[i].getBando() != 2);
        }
        return obj;
    }

    private boolean verifica_llegar() {

        boolean obj = false;

        int num = ejercito.getCant_batallones();

        for (int i = 0; i < num; i++) {

            if (!ejercito.getBatallones().get(i).isMuerto()&& !(ejercito.getBatallones().get(i).getY()==0) &&(this.y >= ejercito.getBatallones().get(i).getY()) && ((this.x - this.rang_x <= ejercito.getBatallones().get(i).getX()) || (this.x + this.rang_x >= ejercito.getBatallones().get(i).getX()))) {

                obj = true;
            }

        }

        return obj;

    }

// comprueba objetivo se debera poner al final de los turnos del jugador para saber si ha cumplido o no el objetivo, ademas si esta cumplido
// automaticamente liberara el mapa para que pueda seguir avanzando
    public void comprueba_objetivo(String mensaje, Ventana_principal v) {

        boolean obj1 = true, obj2 = true, obj3 = true;

        if (!cumplido) {
            if (this.muerte) {

                obj1 = false;
                obj1 = verifica_muerte();

            }

            if (this.reclutar) {

                obj2 = false;
                obj2 = verifica_recluta();

            }

            if (this.llegar) {

                obj3 = false;
                obj3 = verifica_llegar();

            }
        }

        if (obj1 && obj2 && obj3) {
            if (!cumplido) {
                System.out.print("\n" + mensaje);
                v.setCadObj(mensaje);
                v.setImprimirObj(true);
            }
            cumplido = true;
            for (int i = x_impasable - rang_x_impasable; i <= x_impasable + rang_x_impasable; i++) {

                mapa.celdas[y_impasable][i].setElementoEnCelda(' ');

                char tipo=mapa.celdas[y_impasable][i].getTipoTerreno();

                if(mapa.celdas[y_impasable][i].getTipoTerreno()!='e' && mapa.celdas[y_impasable][i].getTipoTerreno()!='.' && mapa.celdas[y_impasable][i].getTipoTerreno()!='E'){
                    if (tipo==' ') mapa.celdas[y_impasable][i].setTile(tiles.get(0));
                    //if (tipo=='E') mapa.celdas[y_impasable][i].setTile(tiles.get(3));
                    //if (tipo=='e') mapa.celdas[y_impasable][i].setTile(tiles.get(2));
                    //if (tipo=='.') mapa.celdas[y_impasable][i].setTile(tiles.get(1));
                     if (tipo=='M') mapa.celdas[y_impasable][i].setTile(tiles.get(5));
                    if (tipo=='L') mapa.celdas[y_impasable][i].setTile(tiles.get(4));
                    if (tipo==',') mapa.celdas[y_impasable][i].setTile(tiles.get(6));
                }

            }

        }

    }

    public boolean is_cumplido() {

        return this.cumplido;

    }

    public void set_tiles(ArrayList<BufferedImage> ti){

        tiles=ti;
    }
    
}
